package run.siyuan.jdk.漫画算法.数组;

/**
 * {@code ClassName:} ArrayLastInsert
 * {@code Description:} TODO 数组的尾插插入、中间插入、超范围插入
 * {@code Author:} siyuan
 * {@code Date:} 2023/4/7 21:30
 *
 * @author wuzhiqian
 */
public class ArrayInsertDemo {

    private int[] array;
    private int size;

    public ArrayInsertDemo(int capacity) {
        this.array = new int[capacity];
        this.size = 0;
    }

    public static void main(String[] args) {
        ArrayInsertDemo array = new ArrayInsertDemo(10);
        // 尾部插入
//        array.wbInsert(123);
//        array.wbInsert(120);
//        array.wbInsert(111);
//        array.wbInsert(110);
//        array.wbInsert(10);
//        array.wbInsert(10);
//        array.wbInsert(10);
//        array.wbInsert(10);
//        array.wbInsert(10);
//        array.wbInsert(10);

        // 中间插入
//        array.zjInsert(1,11);
//        array.zjInsert(2,22);
//        array.zjInsert(3,33);

        // 超范围插入：尾部插入+扩容
        array.cfwInsert(123);
        array.cfwInsert(120);
        array.cfwInsert(111);
        array.cfwInsert(110);
        array.cfwInsert(10);
        array.cfwInsert(10);
        array.cfwInsert(10);
        array.cfwInsert(10);
        array.cfwInsert(10);
        array.cfwInsert(10);
        array.cfwInsert(10);
        array.cfwInsert(10);
        array.cfwInsert(10);
        array.cfwInsert(10);
        array.cfwInsert(10);
        array.cfwInsert(10);
        array.cfwInsert(10);
        array.cfwInsert(10);
        array.cfwInsert(10);
        array.cfwInsert(10);
        array.cfwInsert(10);
        array.cfwInsert(10);
        array.cfwInsert(22);


        array.show();
    }

    /**
     * 尾部插入
     *
     * @param element
     */
    public void wbInsert(int element) {
        if (size > this.array.length) {
            throw new RuntimeException("数组元素已满");
        }
        this.array[size] = element;
        // 已插入元素的数量/对应尾部的下标
        size++;

    }


    /**
     * 中间插入
     *
     * @param index
     * @param element
     */
    public void zjInsert(int index, int element) {
        if (index < 0 || this.array.length < index) {
            throw new RuntimeException("下标越界");
        }

        for (int i = size - 1; i >= index; i--) {
            this.array[i + 1] = this.array[i];
        }
        this.array[index] = element;
        this.size++;
    }

    /**
     * 超范围插入：超过源数组插入后需要扩容
     */
    public void cfwInsert(int element) {
        if (size >= this.array.length) {
            resize();
        }

        this.array[size] = element;
        // 已插入元素的数量/对应尾部的下标
        size++;
    }

    /**
     * 扩容、将源数组中的元素复制到新数组中，最后将新数组复制给源数组。
     */
    public void resize() {
        int length = this.array.length >>> 1;
        length += this.array.length;
        int[] array = new int[length];
        for (int i = 0; i < this.array.length; i++) {
            int element = this.array[i];
            array[i] = element;
        }
        this.array = array;
    }


    public void show() {
        for (int i = 0; i < this.array.length; i++) {
            System.out.printf("%d\t%d\n",i,this.array[i]);

        }
    }


}
